package pe.gob.servir.web.apps.censodirectivo.model.service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.DefaultSubMenu;
import org.primefaces.model.menu.MenuModel;

import pe.gob.servir.apps.censodirectivo.ejb.service.DirectivoPublicoServiceRemote;
import pe.gob.servir.apps.censodirectivo.ejb.service.ResponsableServiceRemote;
import pe.gob.servir.apps.censodirectivo.ejb.service.UsuarioServiceRemote;
import pe.gob.servir.apps.censodirectivo.excepcion.ServiceExcepcion;
import pe.gob.servir.apps.censodirectivo.model.bean.DirectivoPublico;
import pe.gob.servir.apps.censodirectivo.model.bean.OpcionUsuario;
import pe.gob.servir.apps.censodirectivo.model.bean.Responsable;
import pe.gob.servir.web.apps.censodirectivo.controller.util.JSFUtil;

@ManagedBean(name = "menuService")
@SessionScoped
public class MenuService implements Serializable {

	private static final long serialVersionUID = 3717406579869525866L;
	private MenuModel model;
	@EJB(lookup = "java:global/CensoDirectivosEJBEAR/CensoDirectivosEJB/UsuarioService!pe.gob.servir.apps.censodirectivo.ejb.service.UsuarioServiceRemote")
	private UsuarioServiceRemote usuarioServiceRemote;
	
	@EJB(lookup = "java:global/CensoDirectivosEJBEAR/CensoDirectivosEJB/DirectivoPublicoService!pe.gob.servir.apps.censodirectivo.ejb.service.DirectivoPublicoServiceRemote")
	private DirectivoPublicoServiceRemote directivoPublicoServiceRemote;
	
	@EJB(lookup = "java:global/CensoDirectivosEJBEAR/CensoDirectivosEJB/ResponsableService!pe.gob.servir.apps.censodirectivo.ejb.service.ResponsableServiceRemote")
	private ResponsableServiceRemote responsableServiceRemote;
	
	@ManagedProperty("#{loginService}")
	private LoginService loginService;
	
	private static final Logger log = Logger.getLogger(MenuService.class);

	private DirectivoPublico directivoPublico;
	private Responsable responsable;
	private List<OpcionUsuario> listaOpcionesUsuario = new ArrayList<OpcionUsuario>();
	private String menuGenerado;
	
	@PostConstruct
	public void init() {
//		log.info("init()");
		try {
			listaOpcionesUsuario = usuarioServiceRemote.listaOpcionesUsuario(loginService.getUsuario().getUsuario());
			//log.info("listaOpcionesUsuario : " + listaOpcionesUsuario.size());
			long opcion_id_padre_ant = 0 ;
			boolean first = true;
			menuGenerado = "<div class=\"panel-group\" id=\"accordion\" role=\"tablist\" aria-multiselectable=\"true\">";
			for (OpcionUsuario opcion : listaOpcionesUsuario) {
				if (first){
					opcion_id_padre_ant = opcion.getOpcion_id_padre();
					first = false;
				}
				if (opcion.getOpcion_id() == opcion.getOpcion_id_padre()){
					if (opcion.getOpcion_id_padre() != opcion_id_padre_ant){
						menuGenerado = menuGenerado + "</ul></div></div></div>";
					}
					menuGenerado = menuGenerado + "<div class=\"panel panel-default\">";
					menuGenerado = menuGenerado + "<div class=\"panel-heading\" role=\"tab\" id=\"heading" + opcion.getOpcion() + "\">";
					menuGenerado = menuGenerado + "	<h4 class=\"panel-title\"> ";
					menuGenerado = menuGenerado + " <a class=\"collapsed\" data-toggle=\"collapse\" data-parent=\"#accordion\" href=\"#collapse" + opcion.getOpcion_id() + "\" aria-expanded=\"false\" aria-controls=\"collapseOne\"> " + opcion.getOpcion() + " <i class=\"fa fa-angle-down\"></i></a>";
					menuGenerado = menuGenerado + "	</h4>";
					menuGenerado = menuGenerado + "</div>";
					menuGenerado = menuGenerado + "<div id=\"collapse" + opcion.getOpcion_id() + "\" class=\"panel-collapse collapse\" role=\"tabpanel\" aria-labelledby=\"heading" + opcion.getOpcion_id() + "\">";
					menuGenerado = menuGenerado + "	<div class=\"panel-body\">";
					menuGenerado = menuGenerado + "		<ul class=\"subMenu\">";

				}
				if (opcion.getOpcion_id() != opcion.getOpcion_id_padre()){
					menuGenerado = menuGenerado + "<li><a href=\"" + opcion.getUrl() + "\" style=\"background-color: #fafafa; font-size: 12px;\" class=\"ui-menuitem-link ui-corner-all\" tabindex=\"-1\"><span class=\"ui-menuitem-icon ui-icon " + opcion.getIcono() + "\"></span><span class=\"ui-menuitem-text\">" + opcion.getOpcion() + "</span></a></li>";
				}
			}
			menuGenerado = menuGenerado + "</ul></div></div></div>";
			menuGenerado = menuGenerado + "</div>";
			//log.info(menuGenerado);
		} catch (ServiceExcepcion e) {
			e.printStackTrace();
		}
	}

	public MenuModel getModel() {
		try{
			HttpSession session = JSFUtil.getSession();
			long aux = 0, orden = 0;
			
//			log.info("MenuModel getModel()");
			model = new DefaultMenuModel();
			DefaultMenuItem item = null;
			DefaultSubMenu subMenu = null;
	
			for (OpcionUsuario opcion : listaOpcionesUsuario) {
				if (opcion.getUrl() == null) {
					if (aux >= 1) {
						model.addElement(subMenu);
						aux = 0;
					}
	
					if (aux == 0) {
						aux++;
						orden = opcion.getOpcion_id_padre();
						subMenu = new DefaultSubMenu(opcion.getOpcion());
					}
				} else {
					if (orden == opcion.getOpcion_id_padre()) {
						aux++;
						item = new DefaultMenuItem(opcion.getOpcion());
						item.setIcon(opcion.getIcono());
						item.setUrl(opcion.getUrl());
						item.setStyle("background-color: #fafafa; font-size: 12px;");
						item.setId(String.valueOf(opcion.getOpcion_id()));
						if(opcion.getOpcion_id()==24){
							if (loginService.getUsuario().getPerfilId() == 6){
								directivoPublico = directivoPublicoServiceRemote.buscarDirectivoPorId(loginService.getUsuario().getDirectivoId()).get(0);
								if (directivoPublico.getPorcentajeAvance() >= 100 && directivoPublico.getEstadoDirectivoId() == 3 )
									item.setDisabled(false);
								else
									item.setDisabled(true);
							}
						}
						if(opcion.getOpcion_id() == 3 || opcion.getOpcion_id() == 25){
							if (loginService.getUsuario().getPerfilId() == 5){
								responsable = responsableServiceRemote.obtenerPorId(loginService.getUsuario().getResponsableId());
								if (responsable.getEstadoResponsableId() > 3 )
									item.setDisabled(true);
								else
									item.setDisabled(false);
							}else{
								item.setDisabled(false);
							}
						}
						subMenu.addElement(item);
					} 
				}
			}
			if (aux >= 1) {
				model.addElement(subMenu);
				aux = 0;
			}
		}catch(ServiceExcepcion e){
			log.error(e.getMensajeError());
		}
		return model;
	}

	public LoginService getLoginService() {
		return loginService;
	}

	public void setLoginService(LoginService loginService) {
		this.loginService = loginService;
	}

	public List<OpcionUsuario> getListaOpcionesUsuario() {
		return listaOpcionesUsuario;
	}

	public void setListaOpcionesUsuario(List<OpcionUsuario> listaOpcionesUsuario) {
		this.listaOpcionesUsuario = listaOpcionesUsuario;
	}

	public String getMenuGenerado() {
		return menuGenerado;
	}

	public void setMenuGenerado(String menuGenerado) {
		this.menuGenerado = menuGenerado;
	}
	
}